package com.demo.solr.service;

import com.demo.solr.entity.User;
import com.demo.solr.repository.UserSolrRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.*;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Solr UserService 服务类
 *
 * @author YT
 * @date 2019-06-03
 */
@Service
public class UserService {

    @Autowired
    private UserSolrRepository userSolrRepository;

    @Autowired
    private SolrTemplate solrTemplate;

    /**
     * 根据 id 查询 User 对象
     *
     * @param id
     * @return
     */
    public User findUserById(String id){
        return userSolrRepository.findById(id).get();
    }

    /**
     * 查询所有 User 对象
     *
     * @return
     */
    public Iterable<User> findAllUsers(){
        return userSolrRepository.findAll();
    }

    /**
     * 保存 User 对象 / 导入数据
     *
     * @param user
     */
    public void saveUser(User user){
        userSolrRepository.save(user);
    }

    /**
     * 批量保存 User 对象 / 批量导入数据
     *
     * @param users
     */
    public void saveUsers(List<User> users){
        userSolrRepository.saveAll(users);
    }

    /**
     * 获取所有 User 对象分页
     *
     * @return
     */
    // TODO collection 参数传入什么值待后续学习
    public ScoredPage<User> queryUsersForPage(){
        Query query = new SimpleQuery("*:*");
        return solrTemplate.queryForPage("solr_core2",query,User.class);
    }

    /**
     * 根据关键字搜索列表
     *
     * @param searchMap
     * @return
     */
    // TODO 未测试成功 高亮显示功能
    public Map<String,Object> search(Map searchMap){
        Map<String,Object> map = new HashMap<>();
        // 设置高亮查询
        HighlightQuery query = new SimpleHighlightQuery();
        // 设置高亮显示域
        HighlightOptions highlightOptions = new HighlightOptions().addField("name");
        // 高亮前缀
        highlightOptions.setSimplePrefix("<span style='color:red'>");
        // 高亮后缀
        highlightOptions.setSimplePostfix("</span>");
        // 设置高亮选项
        query.setHighlightOptions(highlightOptions);
        // 按照关键字查询
        Criteria criteria = new Criteria("name").is(searchMap.get("keywords"));
        query.addCriteria(criteria);
        // 获取高亮页对象
        HighlightPage<User> page = solrTemplate.queryForHighlightPage("solr_core2",query,User.class);
        // 获取高亮数据
        List<HighlightEntry<User>> highlightEntries = page.getHighlighted();
        Iterator<HighlightEntry<User>> highlightEntryIterator = highlightEntries.iterator();
        while (highlightEntryIterator.hasNext()){
            User user = highlightEntryIterator.next().getEntity();
            List<HighlightEntry.Highlight> highlights = highlightEntryIterator.next().getHighlights();
            //高亮数据
            if(highlights!=null && highlights.size()>0 && highlights.get(0).getSnipplets()!=null && highlights.get(0).getSnipplets().size()>0){
                String snipplets = highlights.get(0).getSnipplets().get(0);
                //替换高亮数据
                user.setName(snipplets);
            }
        }
        map.put("rows",page.getContent());
        return map;
    }
}
